package cn.structure.array;

/**
 * 数组操作:增、删、改、查
 *
 * @author dunlingiz
 */
public class MyArray {

    private int[] array;

    /**
     * 定义数组中的实际元素大小
     */
    private int size;

    public MyArray(int capacity) {
        this.array = new int[capacity];
        size = 0;
    }

    /**
     * 插入
     *
     * @param index   索引下标
     * @param element 插入元素
     * @throws Exception 抛出异常
     */
    public void insert(int index, int element) throws Exception {
        // 索引越界异常
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("索引越界异常");
        }

        // 判断是否超范围插入，
        if (size >= array.length) {
            resize();
        }
        // 从右往左遍历数组，直到索引index位置为止，全部往右移一位
        for (int i = size - 1; i >= index; i--) {
            array[i + 1] = array[i];
        }
        // 在索引index位置插入元素
        array[index] = element;
        size++;
    }

    /**
     * 扩容
     */
    public void resize() {
        int[] reArr = new int[array.length * 2];
        System.arraycopy(array, 0, reArr, 0, array.length);
        array = reArr;
    }

    /**
     * 更新
     *
     * @param index   索引下标
     * @param element 更新元素
     */
    public void update(int index, int element) {
        // 索引越界异常
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("索引越界异常");
        }
        // 在索引index位置更新元素
        array[index] = element;
    }

    /**
     * 删除操作
     *
     * @param index 索引下表
     * @return 删除元素
     * @throws Exception 抛出异常
     */
    public int delete(int index) throws Exception {
        // 索引越界异常
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引越界异常");
        }

        int delNum = array[index];
        // 从右往左遍历数组，直到索引index位置为止，全部往右移一位
        for (int i = index; i < size - 1; i++) {
            array[i] = array[i + 1];
        }
        //todo 末尾需要补位，不然只是将后一个元素赋值给前一个元素
        array[size - 1] = 0;
        size--;
        return delNum;
    }

    /**
     * 输出值
     */
    public void println() {
        StringBuilder sb = new StringBuilder();
        for (int j : array) {
            sb.append(j).append(",");
        }
        System.out.println(sb);
    }

}
